package empresa;

public class Main {
    
    public static void main(String[] args) {
        
        Sistema s=new Sistema();
        Prueba p=new Prueba();

        //----PRUEBASok---------------------------------------------------//
        PruebaOK_1(s,p);
        PruebaOK_2(s,p);
        PruebaOK_3(s,p);
        PruebaOK_4(s,p);
        PruebaOK_5(s,p);
        PruebaOK_6(s,p);
        PruebaOK_7(s,p);
        PruebaOK_8(s,p);

        //----PRUEBASerror---------------------------------------------------//
        PruebaError_1(s,p);
        PruebaError_2(s,p);
        PruebaError_3(s,p);

        //----Resultados---------------------------------------------------//
        p.imprimirResultadosPrueba();
    }
    
    /*--------Pruebas OK ---------------------------*/
    public static void PruebaOK_1(Sistema s, Prueba p){

        Empresa e= s.crearOrg("Decano");
		System.out.println("Se creó empresa con cargo Decano");

        tituloPrueba("PRUEBA OK: AGREGAR CARGOS");

        p.ver( s.NuevoCargo(e, "Decano", "Secretaria"), Sistema.Retorno.OK, "Se agregó cargo Secretaria");
        p.ver( s.NuevoCargo(e, "Decano", "Secretario Académico"), Sistema.Retorno.OK, "Se agregó cargo Secretario Académico");

        p.ver(s.ListarJerarquia(e),Sistema.Retorno.OK, "Se mostró lista jerárquica");
        
        e=s.vaciarEmpresa(e);
        
        finPrueba(" Fin PRUEBA OK 1 ");
    }

     public static void PruebaOK_2(Sistema s, Prueba p){
        
        Empresa e= s.crearOrg("Decano");
		
        tituloPrueba("PRUEBA OK 2: AGREGAR SUB-CARGOS");

        p.ver( s.NuevoCargo(e, "Decano", "Secretaria"), Sistema.Retorno.OK, "Se agregó cargo Secretaria");
        p.ver( s.NuevoCargo(e, "Decano", "Secretario Académico"), Sistema.Retorno.OK, "Se agregó cargo Secretario Académico");

        p.ver( s.NuevoCargo(e, "Secretario Académico", "Catedrático"), Sistema.Retorno.OK, "Se agregó cargo Catedrático");
        p.ver( s.NuevoCargo(e, "Secretario Académico","Coordinador Académico"), Sistema.Retorno.OK, "Se agregó cargo Coordinador Académico");
        p.ver( s.NuevoCargo(e, "Secretario Académico","Coordinador"), Sistema.Retorno.OK, "Se agregó cargo Coordinador");
        
        p.ver( s.NuevoCargo(e, "Coordinador", "Coordinador Adjunto"), Sistema.Retorno.OK, "Se agregó cargo Coordinador Adjunto");
        p.ver( s.NuevoCargo(e, "Coordinador Adjunto", "Bedel"), Sistema.Retorno.OK, "Se agregó cargo Bedel");
        p.ver( s.NuevoCargo(e, "Catedrático", "Docente"), Sistema.Retorno.OK, "Se agregó cargo Docente");

        p.ver(s.ListarJerarquia(e),Sistema.Retorno.OK, "Se mostró lista jerárquica");
        
        e=s.vaciarEmpresa(e);

        finPrueba(" Fin PRUEBA OK 2 ");
    }

     public static void PruebaOK_3(Sistema s, Prueba p){
        
        //Crea la estructura del libro
         Empresa e= s.crearOrg("Decano");
        CreaCargos(s,e);

        tituloPrueba("PRUEBA OK 3: BORRAR SUB-CARGOS");

        //Muestra estructura antes de eliminar
        s.ListarJerarquia(e);
        //Elimina
        p.ver(s.EliminarCargo(e,"Bedel"),Sistema.Retorno.OK,"Se eliminó el subcargo Bedel");
        //Muestra estructura después de eliminar
        p.ver(s.ListarJerarquia(e),Sistema.Retorno.OK, "Se mostró lista jerárquica");

        e=s.vaciarEmpresa(e);

        finPrueba("Fin PRUEBA OK 3");
    }

    public static void PruebaOK_4(Sistema s, Prueba p){
      
        //Crea estructura del libro
        Empresa e= s.crearOrg("Decano");
        CreaCargos(s,e);

        tituloPrueba("PRUEBA OK 4: BORRAR CARGOS");
        
        //Muestra estructura antes de borrar
        s.ListarJerarquia(e);
        //Elimina
        p.ver(s.EliminarCargo(e, "Docente"),Sistema.Retorno.OK,"Se eliminó el cargo Docente");
        //Muestra estructura después de eliminar
         p.ver(s.ListarJerarquia(e),Sistema.Retorno.OK, "Se mostró lista jerárquica");

        e=s.vaciarEmpresa(e);

        finPrueba("Fin PRUEBA OK 4 ");
    }

    public static void PruebaOK_5(Sistema s, Prueba p){

        //Crea estructura del libro
        Empresa e= s.crearOrg("Decano");
        CreaCargos(s,e);

        tituloPrueba("PRUEBA OK 5: LISTAR JERARQUIA");

        //Muestra estructura completa
        p.ver(s.ListarJerarquia(e),Sistema.Retorno.OK, "Se mostró lista jerárquica");

        e=s.vaciarEmpresa(e);

        finPrueba("Fin PRUEBA OK 5");
    }

    public static void PruebaOK_6(Sistema s, Prueba p){
 
        //Crea estructura del libro
        Empresa e= s.crearOrg("Decano");
        CreaCargos(s,e);

        tituloPrueba("PRUEBA OK 6: AGREGAR y LISTAR PERSONAS");

        p.ver(s.AsignarPersona(e,"Decano", 4444444, "Empleado4"),Sistema.Retorno.OK,"Se agregó la persona 4 a Decano");
        p.ver(s.AsignarPersona(e,"Decano", 5555555, "Empleado5"),Sistema.Retorno.OK,"Se agregó la persona 5 a Decano");
        p.ver(s.AsignarPersona(e,"Decano", 6666666, "Empleado6"),Sistema.Retorno.OK,"Se agregó la persona 6 a Decano");

        p.ver(s.ListarPersonas(e,"Decano"),Sistema.Retorno.OK, "Se mostró el listado de personas asignadas a Decano");

        e=s.vaciarEmpresa(e);
      
        finPrueba("Fin PRUEBA OK 6");
    }

    public static void PruebaOK_7(Sistema s, Prueba p){

        //Crea estructura del libro
        Empresa e= s.crearOrg("Decano");
        CreaCargos(s,e);

        tituloPrueba("PRUEBA OK 7: ELIMINAR y LISTAR PERSONAS");
        
        //Agrega claves
     //   s.AsignarPersona(e,"Decano", 4444444, "Empleado4");
        s.AsignarPersona(e,"Decano", 5555555, "Empleado5");
     //   s.AsignarPersona(e,"Decano", 6666666, "Empleado6");
        s.NuevoCargo(e, "Decano", "Secretaria");
        s.AsignarPersona(e, "Secretaria", 7777777, "Juana");
        //p.ver(s.ListarPersonas(e,"Decano"),Sistema.Retorno.OK, "Se mostró el listado de personas asignadas a Decano");

        p.ver(s.EliminarPersona(e,7777777),Sistema.Retorno.OK, "Se eliminó la persona 5555555 del cargo Decano");

        p.ver(s.ListarPersonas(e,"Secretaria"),Sistema.Retorno.OK, "Se mostró el listado de personas asignadas a Decano");

    //    e=s.vaciarEmpresa(e);

        finPrueba("Fin PRUEBA OK 7");
    }

    public static void PruebaOK_8(Sistema s, Prueba p){

        //Crea estructura del libro
        Empresa e= s.crearOrg("Decano");
        CreaCargos(s,e);

        tituloPrueba("PRUEBA OK 8: LISTAR SUPER-CARGOS");

        p.ver(s.ListarJerarquia(e),Sistema.Retorno.OK, "Se mostró lista jerárquica");

        p.ver(s.ListarSuperCargos(e, "Bedel"),Sistema.Retorno.OK, "Se mostraron supercargos de Bedel");

        e=s.vaciarEmpresa(e);

        finPrueba("Fin PRUEBA OK 8");
    }


    //--------Pruebas Error ---------------------------//
    public static void PruebaError_1(Sistema s, Prueba p){

        Empresa e= s.crearOrg("Decano");

        tituloPrueba("PRUEBA ERROR 1: AGREGAR CARGOS REPETIDOS");

        p.ver( s.NuevoCargo(e, "Decano", "Secretaria"), Sistema.Retorno.OK, "Se agregó cargo Secretaria");
        p.ver( s.NuevoCargo(e, "Decano", "Secretaria"), Sistema.Retorno.ERROR, "Error: El cargo Secretaria ya existe");
        p.ver( s.NuevoCargo(e, "Decano", "Secretario Académico"), Sistema.Retorno.OK, "Se agregó cargo Secretario Académico");
        p.ver( s.NuevoCargo(e, "Decano", "Secretario Académico"), Sistema.Retorno.ERROR, "Error: El cargo Secretario Académico ya existe");

        s.ListarJerarquia(e);

        e=s.vaciarEmpresa(e);
       
        finPrueba("Fin PRUEBA ERROR 1");
    }

    public static void PruebaError_2(Sistema s, Prueba p){

        //Crea estructura del libro
        Empresa e= s.crearOrg("Decano");
        CreaCargos(s,e);

        tituloPrueba("PRUEBA ERROR 2: ELIMINAR CARGO QUE NO EXISTE");
        
        p.ver(s.ListarJerarquia(e),Sistema.Retorno.OK, "Se mostró lista jerárquica");

        p.ver(s.EliminarCargo(e,"Asistente Ejecutivo"),Sistema.Retorno.ERROR, "Error: No existe el cargo Asistente Ejecutivo");

        e=s.vaciarEmpresa(e);
        finPrueba("Fin PRUEBA ERROR 2");
    }

    public static void PruebaError_3(Sistema s, Prueba p){

        //Crea estructura del libro
        Empresa e= s.crearOrg("Decano");
        CreaCargos(s,e);

        tituloPrueba("PRUEBA ERROR 3: ELIMINAR PERSONA QUE NO EXISTE");
        
        //Agrega PERSONAS
        s.AsignarPersona(e,"Decano", 4444444, "Empleado4");
        s.AsignarPersona(e,"Decano", 5555555, "Empleado5");
        s.AsignarPersona(e,"Decano", 6666666, "Empleado6");

        p.ver(s.ListarPersonas(e,"Decano"),Sistema.Retorno.OK, "Se mostró el listado de personas asignadas a Decano");

        p.ver(s.EliminarPersona(e, 1111111),Sistema.Retorno.ERROR, "Error: La persona 1111111 no existe");

        p.ver(s.ListarPersonas(e,"Decano"),Sistema.Retorno.OK, "Se mostró el listado de personas asignadas a Decano");

        e=s.vaciarEmpresa(e);
        finPrueba("Fin PRUEBA ERROR 3");
    }
    /*------------------------------------------------------------------*/
    public static void CreaCargos(Sistema s, Empresa e){
        //Crea la estructura de cargos
       s.NuevoCargo(e, "Decano", "Secretaria");
       s.NuevoCargo(e, "Decano", "Secretario Académico");
       s.NuevoCargo(e, "Secretario Académico", "Catedrático");
       s.NuevoCargo(e, "Secretario Académico","Coordinador Académico");
       s.NuevoCargo(e, "Secretario Académico","Coordinador");
       s.NuevoCargo(e, "Coordinador", "Coordinador Adjunto");
       s.NuevoCargo(e, "Coordinador Adjunto", "Bedel");
       s.NuevoCargo(e, "Catedrático", "Docente");

    }

    public static void tituloPrueba(String s){
        System.out.println("**************************************************************************");
        System.out.println("  "+ s );
        System.out.println("**************************************************************************");
    }

    public static void finPrueba(String s){
        System.out.println("************************ " + s +" ***********************");
        System.out.println("*******************************************************************");
        System.out.println();
    }

}
